home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 19.zip
/
BS1 part 19
/
AmigaLibDisk 162.adf
/
Iffar
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-10-02
|
6KB
|
214 lines
/* iffar - IFF CAT archiver, main()
By Karl Lehenbauer, version 1.2, release date 5/9/88.
This code is released to the public domain.
See the README file for more information.
*/
/* iffar - iff 'cat' archiver, 3/26/88 */
#include <stdio.h>
#include "assert.h"
/* options */
int verbose = 0;
int insert_after = 0;
int insert_before = 0;
int suppress_creation_message = 0;
/* if insert_after or insert_before is set, this global has the relevant
* name */
char *location_modifier_name;
/* variables */
int number_of_arguments; /* number of args to the program, a global */
/* this'll point to the command line's command char string */
char *cmdkeys;
/* this'll be the name of the archive file */
char *archive_name;
/* this'll contain the command */
char command_key;
/* if a command must have some names as arguments, must_have_names can be
* called to insure that arguments were supplied.
* Note that what constitutes the presence of arguments varies whether
* a positional modifier ('i', 'b' or 'a') was specified.
*/
must_have_names()
{
if ((insert_before || insert_after) && (number_of_arguments < 5))
{
fprintf(stderr,"a positioning element and at least one other element must be specified for\n");
fprintf(stderr,"the combination of options you have requested.\n");
usage();
}
if (number_of_arguments < 4)
{
fprintf(stderr,"at least one archive element must be specified for this option\n");
usage();
}
}
header()
{
fprintf(stderr,"iffar - public domain IFF CAT archiver, Version 1.1, by Karl Lehenbauer\n\n");
fprintf(stderr,"This program maintains archives of IFF FORM, CAT and LIST files\n");
fprintf(stderr,"in a manner that complies with the IFF CAT specification.\n");
}
/* usage print usage text and exit */
usage()
{
fprintf(stderr,"\nUsage: iffar key [posname] afile name ...\n\n");
fprintf(stderr,"key can be one of the following:\n");
fprintf(stderr,"\td\tdelete\n\tr\treplace\n\tq\tquick append\n");
fprintf(stderr,"\tt\ttable of contents\n\tx\textract\n");
fprintf(stderr,"and zero or more of the following options:\n");
fprintf(stderr,"\tv\tverbose\n\ta\tafter\n\ti,b\tbefore\n");
fprintf(stderr,"\tc\tsuppress creation message\n");
cleanup();
exit(1);
}
main(argc,argv)
int argc;
char *argv[];
{
int i, j;
int archive_fd, files;
char *nameptr;
char **entryname_pointers;
int entrycount;
number_of_arguments = argc;
if (argc < 3)
{
header();
usage();
}
/* assign nice variable names to various command line arguments */
cmdkeys = argv[1];
command_key = *cmdkeys;
archive_name = argv[2];
location_modifier_name = (char *)NULL;
entryname_pointers = &argv[3];
entrycount = argc - 3;
/* figure out any modifiers specified to the main function requested */
for (i = 1; i < strlen(cmdkeys); i++)
{
switch(cmdkeys[i])
{
case 'v': /* verbose selected, set verbose flag */
verbose = 1;
break;
/* 'after' option, make sure they've selected 'r' or 'm' as
* the main command. Also, make sure they haven't already
* chosen the insert_before option. After that, we're OK,
* so twiddle parameters and break
*/
case 'a':
if (command_key != 'r' && command_key != 'm')
{
fprintf(stderr,"i, b and a modifiers are only good for r and m options\n");
usage();
}
if (insert_before)
{
fprintf(stderr,"you can't select 'insert before' and 'insert after'\n");
usage();
}
insert_after = 1;
location_modifier_name = argv[3];
entryname_pointers = &argv[4];
entrycount = argc - 4;
break;
/* 'insert before' option, make sure they've selected 'r' or
* 'm' as the main command. Also, make sure they haven't already
* chosen the insert_after option. After that, we're OK,
* so twiddle parameters and break
*/
case 'i': /* insert; before */
case 'b':
if (command_key != 'r' && command_key != 'm')
{
fprintf(stderr,"i, b and a modifiers are only good for r and m options\n");
usage();
}
if (insert_after)
{
fprintf(stderr,"you can't select 'insert before' and 'insert after'\n");
usage();
}
insert_before = 1;
location_modifier_name = argv[3];
entryname_pointers = &argv[4];
entrycount = argc - 4;
break;
case 'c': /* supress creation message */
suppress_creation_message = 1;
break;
default: /* unrecognized option */
fprintf(stderr,"option '%c' unrecognized\n",cmdkeys[i]);
usage();
}
}
/* now execute the major command */
switch(command_key)
{
case 'd': /* delete */
must_have_names();
delete_entries(archive_name,entryname_pointers,entrycount);
break;
/* replace - if the archive doesn't exist, fall through to
* quick append */
case 'r':
must_have_names();
if ((archive_fd = open(archive_name,O_RDONLY)) != -1)
{
close(archive_fd);
replace_entries(archive_name,entryname_pointers,entrycount);
break;
}
case 'q': /* quick append */
must_have_names();
checknew(archive_name);
if ((archive_fd = open_quick_append(archive_name)) == -1)
break;
quickappend_entries(archive_fd,entryname_pointers,entrycount);
break;
case 't': /* table of contents */
table_of_contents(archive_name);
break;
case 'm': /* move */
fprintf(stderr,"move option not implemented\n");
must_have_names();
break;
case 'x': /* extract */
extract(archive_name,entryname_pointers,entrycount);
break;
default:
fprintf(stderr,"requested command (%c) is invalid\n",command_key);
usage();
}
cleanup();
exit(0);
}
/* end of main.c */